package com.hhxy.service.impl;

import com.google.gson.Gson;
import com.hhxy.handler.exception.CustomException;
import com.hhxy.service.UploadService;
import com.hhxy.utils.PathUtils;
import com.hhxy.utils.response.AppHttpCodeEnum;
import com.hhxy.utils.response.ResponseResult;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;

/**
 * @author ghp
 * @date 2023/4/29
 * @title
 * @description
 */
@Service
@Data
@ConfigurationProperties(prefix = "oss") // 需要引入注解处理器依赖
@Slf4j
public class UploadServiceImpl implements UploadService {

    /**
     * 上传图片
     *
     * @param img
     * @return
     */
    @Override
    public ResponseResult uploadImg(MultipartFile img) {

        //判断文件类型
        //获取原始文件名
        String originalFilename = img.getOriginalFilename();
        //对原始文件名进行判断（只能上传png或者jpg格式的图片）
        if (!originalFilename.endsWith(".png") && !originalFilename.endsWith(".jpg")) {
            throw new CustomException(AppHttpCodeEnum.CLIENT_IMG_ERROR);
        }

        //如果判断通过上传文件到OSS
        String filePath = PathUtils.generateFilePath(originalFilename);
        filePath = "ghp-sg-blog-img/" + filePath;
        String url = uploadOss(img, filePath);
        return ResponseResult.okResult(url);
    }

    /**
     * 访问密钥
     */
    private String accessKey;

    /**
     * 秘密密钥
     */
    private String secretKey;

    /**
     * 文件名
     */
    private String bucket;

    /**
     * 外链域名（七牛云提供的测试域名只能使用30天）
     */
    public static final String URL = "http://rtv6qahf2.hn-bkt.clouddn.com/";

    /**
     * 上传文件到OSS（七牛云的云存储）
     *
     * @param imgFile  文件的字节流
     * @param filePath 文件上传路径
     */
    private String uploadOss(MultipartFile imgFile, String filePath) {

        //构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.autoRegion());

        UploadManager uploadManager = new UploadManager(cfg);

        // 默认不指定key的情况下，以文件内容的hash值作为文件名
        String key = filePath;

        try {
            InputStream inputStream = imgFile.getInputStream();
            Auth auth = Auth.create(accessKey, secretKey);
            String upToken = auth.uploadToken(bucket);
            try {
                Response response = uploadManager.put(inputStream, key, upToken, null, null);
                // 解析上传成功的结果
                DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
                log.info("上传路径:{}", putRet.key);
                log.info("上传成功后生成的hash: {}", putRet.hash);
                return URL + key;
            } catch (QiniuException ex) {
                Response r = ex.response;
                log.error("发生异常，异常信息：r.toString{}", r.toString());
            }
        } catch (Exception ex) {
            log.error("发生异常, 异常信息：{}", ex.getMessage());
        }
        // 出现了其它问题，响应一个www字符串给前台
        return "图片上传失败！";
    }
}

